package es.tikitaka.dao.impl;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;

import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;

import es.tikitaka.dao.EstJugadorService;
import es.tikitaka.domain.Temporada;
import es.tikitaka.domain.jugador.EstJugador;

/**
 * 
 * @author Saúl Domínguez
 * @since 2010
 * @category PFC
 */
@Name("estJugadorService")
public class EstJugadorServiceImpl implements EstJugadorService {

	@In
	EntityManager em;

	/**
	 * Constructor por defecto
	 */
	public EstJugadorServiceImpl() {
	}

	/**
	 * Método para obtener la lista de los jugadores más goleadores
	 * 
	 * @param temporada
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<EstJugador> getListPichichi(Temporada temporada) {
		List<EstJugador> result = new ArrayList<EstJugador>();

		result = em
				.createQuery(
						"select e from EstJugador e join fetch e.jugador j join fetch j.temporada t join fetch j.posicion p where t.anio =:temporada and p.posicion <> 'Portero' order by e.goles")
				.setParameter("temporada", temporada.getAnio()).getResultList();

		return result;
	}

	/**
	 * Método para obtener la lista de los porteros menos goleados
	 * 
	 * @param temporada
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<EstJugador> getListZamora(Temporada temporada) {
		List<EstJugador> result = new ArrayList<EstJugador>();

		result = em
				.createQuery(
						"select e from EstJugador e join fetch e.jugador j join fetch j.temporada t join fetch j.posicion p where t.anio =:temporada and p.posicion = 'Portero' order by e.goles desc")
				.setParameter("temporada", temporada.getAnio()).getResultList();

		return result;
	}

	/**
	 * Método para obtener la lista de los jugadores con más faltas
	 * 
	 * @param temporada
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<EstJugador> getListFaltas(Temporada temporada) {
		List<EstJugador> result = new ArrayList<EstJugador>();

		result = em
				.createQuery(
						"select e from EstJugador e join fetch e.jugador j join fetch j.temporada t join fetch j.posicion p where t.anio =:temporada and p.posicion <> 'Portero' order by e.faltas")
				.setParameter("temporada", temporada.getAnio()).getResultList();

		return result;
	}

	/**
	 * Método para obtener la lista de los jugadores con más amonestaciones
	 * 
	 * @param temporada
	 * @param tarjeta
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<EstJugador> getListAmonestados(Temporada temporada,
			String tarjeta) {
		List<EstJugador> result = new ArrayList<EstJugador>();
		if (tarjeta.equals("Tarjeta amarilla")) {
			result = em
					.createQuery(
							"select e from EstJugador e join fetch e.jugador j join fetch j.temporada t where t.anio =:temporada order by e.amarillas")
					.setParameter("temporada", temporada.getAnio())
					.getResultList();
		} else if (tarjeta.equals("Tarjeta roja")) {
			result = em
					.createQuery(
							"select e from EstJugador e join fetch e.jugador j join fetch j.temporada t where t.anio =:temporada order by e.rojas")
					.setParameter("temporada", temporada.getAnio())
					.getResultList();
		} else if (tarjeta.equals("Tarjeta azul")) {
			result = em
					.createQuery(
							"select e from EstJugador e join fetch e.jugador j join fetch j.temporada t where t.anio =:temporada order by e.azules")
					.setParameter("temporada", temporada.getAnio())
					.getResultList();
		}
		return result;
	}

	/**
	 * Método para obtener la lista de los jugadores que más penaltys han
	 * lanzado
	 * 
	 * @param temporada
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<EstJugador> getListPenaltysLanzados(Temporada temporada) {
		List<EstJugador> result = new ArrayList<EstJugador>();
		result = em
				.createQuery(
						"select e from EstJugador e join fetch e.jugador j join fetch j.temporada t join fetch j.posicion p where t.anio =:temporada and p.posicion <> 'Portero' order by e.penaltysL")
				.setParameter("temporada", temporada.getAnio()).getResultList();

		return result;
	}

	/**
	 * Método para obtener la lista de los jugadores que más penaltys han
	 * cometido
	 * 
	 * @param temporada
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<EstJugador> getListPenaltysCometidos(Temporada temporada) {
		List<EstJugador> result = new ArrayList<EstJugador>();
		result = em
				.createQuery(
						"select e from EstJugador e join fetch e.jugador j join fetch j.temporada t join fetch j.posicion p where t.anio =:temporada and p.posicion <> 'Portero' order by e.penaltysC")
				.setParameter("temporada", temporada.getAnio()).getResultList();

		return result;
	}

	/**
	 * Método para eliminar del sistema unas estadisticas de jugador dada
	 * 
	 * @param id
	 *            Id de las estadisticas de jugador a eliminar
	 * @return estado del proceso (true or false)
	 */
	public boolean delete(Integer id) {
		boolean correcto;
		try {
			EstJugador est = em.getReference(EstJugador.class, id);
			em.remove(est);
			correcto = true;
		} catch (RuntimeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			correcto = false;
		}
		return correcto;
	}

	/**
	 * Método para almacenar en el sistema estadísticas de un jugador
	 * 
	 * @param estadisticas
	 *            Estadísticas a almacenar
	 * @return estado del proceso (true or false)
	 */
	public boolean save(EstJugador estadisticas) {
		boolean correcto;
		try {
			em.persist(estadisticas);
			em.flush();
			correcto = true;
		} catch (RuntimeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			correcto = false;
		}
		return correcto;
	}
}
